package com.zzyl.framework.interceptor;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.zzyl.common.core.domain.model.LoginUser;
import com.zzyl.common.utils.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 自定义元对象字段自动填充处理器，用于在插入和更新操作时自动填充创建人、创建时间、更新人、更新时间等字段。
 *
 * @author Your Team
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入操作时自动填充的字段
     *
     * @param metaObject 元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 填充创建时间字段，值为当前时间
        strictInsertFill(metaObject, "createTime", Date.class, new Date());
        // 填充创建人字段，值为当前登录用户ID
        strictInsertFill(metaObject, "createBy", String.class, String.valueOf(getLoginUser()));
    }

    /**
     * 更新操作时自动填充的字段
     *
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 填充更新时间字段，值为当前时间
        // strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
        // // 填充更新人字段，值为当前登录用户ID
        // strictUpdateFill(metaObject, "updateBy", String.class, String.valueOf(loadUserId()));

        //MetaObjectHandler 提供的默认方法策略是：如果属性有值则不覆盖，如果填充值为 null 则不填充。
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", String.valueOf(getLoginUser()), metaObject);
    }

    /**
     * 获取当前登录用户的ID
     *
     * @return 登录用户ID，若未登录则返回默认值 1L
     */
    public Long getLoginUser() {
        // 使用 SecurityUtils 工具类获取当前登录用户信息
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser != null) {
            return loginUser.getUserId();
        }
        // 若无法获取到登录用户，则使用默认值 1L（可能是匿名用户或系统预留ID）
        return 1L;
    }
}